package org.koron.ebs.util.field;

import java.util.HashMap;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 * 栏位定义. 可以用任何符合规范的地方，实现了bean到html的转换。由栏位自动生成HTML代码
 * 
 * @author swan
 *
 */
public class FieldBean implements Cloneable {
	/**
	 * 复合型
	 */
	public static final long COMBIN = 0x400000;
	/**
	 * 文本框
	 */
	public static final long TEXTFIELD = 0x40000000;
	/**
	 * 下拉框
	 */
	public static final long SELECT = 0x20000000l;
	/**
	 * 单选框
	 */
	public static final long RADIO = 0x10000000l;
	/**
	 * 复选框
	 */
	public static final long CHECKBOX = 0x8000000l;
	/**
	 * 按钮
	 */
	public static final long BUTTON = 0x4000000l;
	/**
	 * 文本显示
	 */
	public static final long LABEL = 0x2000000l;
	/**
	 * 图片
	 */
	public static final long IMAGE = 0x1000000;
	/**
	 * 多行文本框
	 */
	public static final long TEXTAREA = 0x800000;
	/**
	 * 普通文本
	 * 
	 * @see #TEXTFIELD
	 */
	public static final long TEXTFIELD_WORD = 0x8000;
	/**
	 * 密码
	 * 
	 * @see #TEXTFIELD_WORD
	 */
	public static final long TEXTFIELD_PASSWORD = 0x20;
	/**
	 * 隐藏
	 */
	public static final long TEXTFIELD_HIDDEN = 0x10;
	/**
	 * 数字
	 * 
	 * @see #TEXTFIELD
	 */
	public static final long TEXTFIELD_NUMBERIC = 0x4000;
	/**
	 * 正负数
	 * 
	 * @see #TEXTFIELD_NUMBERIC
	 */
	public static final long TEXTFIELD_NUMBERIC_POSITIVE = 0x80;
	/**
	 * 整数
	 * 
	 * @see #TEXTFIELD_NUMBERIC
	 */
	public static final long TEXTFIELD_NUMBERIC_INTEGER = 0x40;
	/**
	 * 时间日期输入框
	 * 
	 * @see #TEXTFIELD
	 */
	public static final long TEXTFIELD_DATETIME = 0x2000;
	/**
	 * 日期
	 * 
	 * @see #TEXTFIELD_DATETIME
	 */
	public static final long TEXTFIELD_DATETIME_DATE = 0x80;
	/**
	 * 时间
	 * 
	 * @see #TEXTFIELD_DATETIME
	 */
	public static final long TEXTFIELD_DATETIME_TIME = 0x40;
	/**
	 * 纯一个文字，DIV内包含文字
	 */
	public static final long LABEL_PEER = 0x80;
	/**
	 * 静态数据,针对多数据方式：包含下拉框，单选框，复选框
	 * 
	 * @see #CHECKBOX
	 * @see #RADIO
	 * @see #SELECT
	 */
	public static final long STATICDATA = 0x8000;
	/**
	 * AJAX方式,针对多数据方式：包含下拉框，单选框，复选框
	 * 
	 * @see #CHECKBOX
	 * @see #RADIO
	 * @see #SELECT
	 */
	public static final long AJAXDATA = 0x4000;
	
	/**
	 * 标签过滤器的类名
	 */
	public static final String TAGFILTER = "_tagFilter";
	/**
	 * bean过滤器的类名
	 */
	public static final String BEANFILTER = "_beanFilter";
	/**
	 * 标识
	 */
	private String id;
	/**
	 * 名称
	 */
	private String name;
	/**
	 * 短描述
	 */
	private String caption;
	/**
	 * 长描述
	 */
	private String desc;
	/**
	 * 类型. 用一个整型，采用位运算描述,0-31各对应相应的内容 详见resource下图片
	 * 
	 */
	private long type;
	/**
	 * <pre>
	 * 参数,json格式.
	 * 正则表达式为regx 
	 * ajax为url 
	 * 固定值为data {"1":"是","0":"否"} 
	 * 提示信息 placeholder
	 * 缺省值为 defaultValue
	 * 宽度 width(label+peer时用)
	 * Bean过滤器 {@link #BEANFILTER}
	 * TAG过滤器
	 * {@link #TAGFILTER}
	 * 
	 * <pre>
	 */
	private String param;
	/**
	 * 样式名(css中可使用)
	 */
	private String className;
	/**
	 * 验证用的正则表达式
	 */
	private String validate;
	/**
	 * 属性值，缓存用。
	 */
	private transient HashMap<String, String> map = null;

	/**
	 * 构造函数
	 * 
	 * @param name 名称
	 * @param type 类型
	 */
	public FieldBean(String name, long type) {
		super();
		this.name = name;
		this.id = name;
		this.type = type;
		param = "{}";
	}

	/**
	 * 获取参数
	 * 
	 * @param name 参数名
	 * @return 参数值
	 */
	public String getParam(String name) {
		if (map == null)
			map = new Gson().fromJson(getParam(), new TypeToken<HashMap<String, String>>() {
			}.getType());
		return map.get(name);
	}

	/**
	 * 设置属性
	 * 
	 * @param name 属性名称
	 * @param value 值
	 */
	public void setParam(String name, String value) {
		HashMap<String, String> map = new Gson().fromJson(getParam(), new TypeToken<HashMap<String, String>>() {
		}.getType());
		map.put(name, value);
		this.setParam(new Gson().toJson(map));
	}

	/**
	 * @return 获取名称
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name 设置名称
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return 获取短描述
	 */
	public String getCaption() {
		return caption;
	}

	/**
	 * @param caption 设置短描述
	 */
	public void setCaption(String caption) {
		this.caption = caption;
	}

	/**
	 * @return 获取长描述
	 */
	public String getDesc() {
		return desc;
	}

	/**
	 * @param desc 设置长描述
	 */
	public void setDesc(String desc) {
		this.desc = desc;
	}

	/**
	 * @return 获取类型
	 */
	public long getType() {
		return type;
	}

	/**
	 * @param type 设置类型
	 */
	public void setType(long type) {
		this.type = type;
	}

	/**
	 * @return 获取参数json格式
	 */
	public String getParam() {
		return param;
	}

	/**
	 * @param param 设置参数json格式
	 */
	public void setParam(String param) {
		this.param = param;
		this.map = null;
	}

	/**
	 * @return 获取样式名(css中可使用)
	 */
	public String getClassName() {
		return className;
	}

	/**
	 * @param className 设置样式名(css中可使用)
	 */
	public void setClassName(String className) {
		this.className = className;
	}

	/**
	 * @return 获取标识
	 */
	public String getId() {
		return id;
	}

	/**
	 * @param 设置标识
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * @return 获取验证用的正则表达式
	 */
	public String getValidate() {
		return validate;
	}

	/**
	 * @param 设置验证用的正则表达式
	 */
	public void setValidate(String validate) {
		this.validate = validate;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#clone()
	 */
	@Override
	protected FieldBean clone() {
		try {
			FieldBean bean = (FieldBean) super.clone();
			bean.map = null;
			return bean;
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
}